home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / drdobbs / xsharp / ball / addrot.c next >
Text File  |  1991-12-23  |  3KB  |  68 lines

  1. /* Routines to perform incremental rotations around the three axes */
  2. #include <math.h>
  3. #include "polygon.h"
  4.  
  5. /* Concatenate a rotation by Angle around the X axis to the
  6.    transformation in XformToChange, placing result back in
  7.    XformToChange. */
  8. void AppendRotationX(double XformToChange[4][4], double Angle)
  9. {
  10.    double Temp10, Temp11, Temp12, Temp20, Temp21, Temp22;
  11.    double CosTemp = cos(Angle), SinTemp = sin(Angle);
  12.  
  13.    /* Calculate the new values of the four affected matrix entries */
  14.    Temp10 = CosTemp*XformToChange[1][0]+ -SinTemp*XformToChange[2][0];
  15.    Temp11 = CosTemp*XformToChange[1][1]+ -SinTemp*XformToChange[2][1];
  16.    Temp12 = CosTemp*XformToChange[1][2]+ -SinTemp*XformToChange[2][2];
  17.    Temp20 = SinTemp*XformToChange[1][0]+ CosTemp*XformToChange[2][0];
  18.    Temp21 = SinTemp*XformToChange[1][1]+ CosTemp*XformToChange[2][1];
  19.    Temp22 = SinTemp*XformToChange[1][2]+ CosTemp*XformToChange[2][2];
  20.    /* Put the results back into XformToChange */
  21.    XformToChange[1][0] = Temp10; XformToChange[1][1] = Temp11;
  22.    XformToChange[1][2] = Temp12; XformToChange[2][0] = Temp20; 
  23.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  24. }
  25.  
  26. /* Concatenate a rotation by Angle around the Y axis to the
  27.    transformation in XformToChange, placing result back in
  28.    XformToChange. */
  29. void AppendRotationY(double XformToChange[4][4], double Angle)
  30. {
  31.    double Temp00, Temp01, Temp02, Temp20, Temp21, Temp22;
  32.    double CosTemp = cos(Angle), SinTemp = sin(Angle);
  33.  
  34.    /* Calculate the new values of the four affected matrix entries */
  35.    Temp00 = CosTemp*XformToChange[0][0]+ SinTemp*XformToChange[2][0];
  36.    Temp01 = CosTemp*XformToChange[0][1]+ SinTemp*XformToChange[2][1];
  37.    Temp02 = CosTemp*XformToChange[0][2]+ SinTemp*XformToChange[2][2];
  38.    Temp20 = -SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[2][0];
  39.    Temp21 = -SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[2][1];
  40.    Temp22 = -SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[2][2];
  41.    /* Put the results back into XformToChange */
  42.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  43.    XformToChange[0][2] = Temp02; XformToChange[2][0] = Temp20;
  44.    XformToChange[2][1] = Temp21; XformToChange[2][2] = Temp22;
  45. }
  46.  
  47. /* Concatenate a rotation by Angle around the Z axis to the
  48.    transformation in XformToChange, placing result back in
  49.    XformToChange. */
  50. void AppendRotationZ(double XformToChange[4][4], double Angle)
  51. {
  52.    double Temp00, Temp01, Temp02, Temp10, Temp11, Temp12;
  53.    double CosTemp = cos(Angle), SinTemp = sin(Angle);
  54.  
  55.    /* Calculate the new values of the four affected matrix entries */
  56.    Temp00 = CosTemp*XformToChange[0][0]+ -SinTemp*XformToChange[1][0];
  57.    Temp01 = CosTemp*XformToChange[0][1]+ -SinTemp*XformToChange[1][1];
  58.    Temp02 = CosTemp*XformToChange[0][2]+ -SinTemp*XformToChange[1][2];
  59.    Temp10 = SinTemp*XformToChange[0][0]+ CosTemp*XformToChange[1][0];
  60.    Temp11 = SinTemp*XformToChange[0][1]+ CosTemp*XformToChange[1][1];
  61.    Temp12 = SinTemp*XformToChange[0][2]+ CosTemp*XformToChange[1][2];
  62.    /* Put the results back into XformToChange */
  63.    XformToChange[0][0] = Temp00; XformToChange[0][1] = Temp01;
  64.    XformToChange[0][2] = Temp02; XformToChange[1][0] = Temp10;
  65.    XformToChange[1][1] = Temp11; XformToChange[1][2] = Temp12;
  66. }
  67.  
  68.